home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 1.st / POGOSRC.ARC / PREDEFS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1985-11-20  |  12.3 KB  |  641 lines

  1.  
  2. /* predefs.c - Stuff to bind build in C and ASM functions to pogo, and
  3.   some of the smaller functions themselves. */
  4.  
  5. #include <stdio.h>
  6. #include "pogo.h"
  7.  
  8. /* file functions */
  9. extern popen(), pclose(), pgetchar();
  10. extern char *pgetword(), *pgetline();
  11. extern pputchar(), pputs(), pputline();
  12.  
  13. /* screen oriented functions */
  14. extern pscreen(), palloc_screen(), pfree_screen(), pcopy_screen(),
  15.     puse_screen(), pblit(), ptblit(), pload_pic(), psave_pic();
  16.  
  17. /* fli functions */
  18. extern create_fli(), save_next_fli(), end_fli();
  19.  
  20. /* input functions */
  21. extern inkey(), rawkey(), waitkey(), mouse_x(), mouse_y(),
  22.     joystick(), use_mouse(), use_joy(),
  23.     mouse_left(), mouse_right(), get_clock();
  24.  
  25. /* graphics functions */
  26. extern to_text(), to_graphics(), clear_screen(),
  27.     pgtext(), pgnumber(),
  28.     pline(), pputdot(), disk(), circle();
  29.  
  30. /* "Turtle" functions */
  31. extern right(), left(), penup(), pendown(), pencolor(), forward(),
  32.     closest_type(),    reverse();
  33.  
  34. /* double-buffering animation functions */
  35. extern swap(), de_swap(), pre_swap(), vsync();
  36.  
  37. /* Creature finding functions */
  38. extern closest_creature(), named_creature(), exists_creature();
  39.  
  40. extern kill_all();
  41.  
  42. /* Creature information function */
  43. extern creature_x(), creature_y(), creature_age(), creature_newborn();
  44. extern char *creature_name();
  45.  
  46. extern int in_graphics;
  47.  
  48. int randseed;
  49.  
  50. parctan(p)
  51. union pt_int *p;
  52. {
  53. return(arctan(p[-2].i, p[-1].i));
  54. }
  55.  
  56. extern char *add_cr_string();
  57.  
  58. pstrlen(p)
  59. union pt_int *p;
  60. {
  61. char *s;
  62.  
  63. s = p[-1].p;
  64. if (s == NULL)
  65.     return(-1);
  66. else
  67.     return(strlen(s));
  68. }
  69.  
  70. pcharat(p)
  71. union pt_int *p;
  72. {
  73. register char *n;
  74. int count;
  75. char c;
  76.  
  77. if ((n = p[-2].p) == NULL)
  78.     return(0);
  79. count = p[-1].i;
  80. for (;;)
  81.     {
  82.     if ((c = *n++) == 0)
  83.         break;
  84.     if (--count < 0)
  85.         break;
  86.     }
  87. return(c);
  88. }
  89.  
  90. pcharto(p)
  91. union pt_int *p;
  92. {
  93. register char *n;
  94. int count;
  95. char data;
  96. char c;
  97.  
  98. if ((n = p[-3].p) == NULL)
  99.     return(0);
  100. count = p[-2].i;
  101. for (;;)
  102.     {
  103.     if ((c = *n) == 0)
  104.         return(0);
  105.     if (--count < 0)
  106.         {
  107.         *n = p[-1].i;
  108.         break;
  109.         }
  110.     n++;
  111.     }
  112. return(c);
  113. }
  114.  
  115.  
  116. char *
  117. pstrnum(p)
  118. union pt_int *p;
  119. {
  120. char buf[10];
  121. char *s;
  122.  
  123. sprintf(buf, "%d", p[-1].i);
  124. s = clone_string(buf);
  125. add_cr_string(s);
  126. return(s);
  127. }
  128.  
  129. char *
  130. pstrchar(p)
  131. union pt_int *p;
  132. {
  133. static char buf[2];
  134. char *s;
  135.  
  136. buf[0] = p[-1].i;
  137. s = clone_string(buf);
  138. add_cr_string(s);
  139. return(s);
  140. }
  141.  
  142.  
  143. psquare_root(p)
  144. union pt_int *p;
  145. {
  146. long x;
  147.  
  148. if ((x = p[-1].i) < 0)
  149.     return(-1);
  150. return(sqr_root( x ));
  151. }
  152.  
  153. psamename(p)
  154. union pt_int *p;
  155. {
  156. return(jstrcmp(p[-1].p, p[-2].p) == 0);
  157. }
  158.  
  159. pstrcmp(p)
  160. union pt_int *p;
  161. {
  162. return(jstrcmp(p[-1].p, p[-2].p));
  163. }
  164.  
  165. parcx(p)
  166. union pt_int *p;
  167. {
  168. return(itmult(icos(sscale_by(p[-2].i, 1024, 360)),p[-1].i));
  169. }
  170.  
  171. parcy(p)
  172. union pt_int *p;
  173. {
  174. return(itmult(isin(sscale_by(p[-2].i, 1024, 360)),p[-1].i));
  175. }
  176.  
  177. pdisk(p)
  178. union pt_int *p;
  179. {
  180. if (!in_graphics)
  181.     to_graphics();
  182. p -= 4;        /* move p to first parameter */
  183. disk(p[0].i, p[1].i, p[2].i, p[3].i);
  184. }
  185.  
  186. pcircle(p)
  187. union pt_int *p;
  188. {
  189. if (!in_graphics)
  190.     to_graphics();
  191. p -= 4;        /* move p to first parameter */
  192. circle(p[0].i, p[1].i, p[2].i, p[3].i);
  193. }
  194.  
  195. pdistance(p)
  196. union pt_int *p;
  197. {
  198. int dx, dy;
  199.  
  200. dx = p[-4].i - p[-2].i;
  201. dy = p[-3].i - p[-1].i;
  202. return(sqr_root(mult_to_long(dx,dx) + mult_to_long(dy,dy)));
  203. }
  204.  
  205. pgetdot(p)
  206. union pt_int *p;
  207. {
  208. if (!in_graphics)
  209.     to_graphics();
  210. p -= 2;        /* move p to first parameter */
  211. return(getdot(p[0].i, p[1].i));
  212. }
  213.  
  214. pputdot(p)
  215. union pt_int *p;
  216. {
  217. if (!in_graphics)
  218.     to_graphics();
  219. p -= 3;        /* move p to first parameter */
  220. putdot(p[1].i, p[2].i, p[0].i);    /* pogo want's color 1st, putdot last */
  221. }
  222.  
  223.  
  224. rectangle(p)
  225. union pt_int *p;
  226. {
  227. if (!in_graphics)
  228.     to_graphics();
  229. p -= 5;
  230. colblock(p[0].i, p[1].i, p[2].i, p[3].i, p[4].i);
  231. }
  232.  
  233.  
  234. random(p)
  235. union pt_int *p;
  236. {
  237. p -= 1;        /* move p to first parameter */
  238. randseed = randseed<<1;
  239. if (randseed >= 0)
  240.     randseed = randseed^0x2b41;
  241. return((unsigned)randseed%(unsigned)p->i);
  242. }
  243.  
  244.  
  245. struct func_frame *
  246. add_predef(name, code, pcount)
  247. char *name;
  248. function *code;
  249. int pcount;
  250. {
  251. Symbol *ns;
  252. struct func_frame *fuf;
  253.  
  254. upper_case(name);
  255. if ((fuf = beg_zero(sizeof(*fuf))) == NULL)
  256.     return(0);
  257. fuf->pcount = pcount;
  258. fuf->code = (struct pogo_op *)code;
  259. dupe_bytes(fuf->ptypes, INT, pcount);
  260. if ((ns = new_symbol(name, PREDEF, GLOBAL, rframe)) == NULL)
  261.     {
  262.     freemem(fuf);
  263.     return(NULL);
  264.     }
  265. ns->symval.p = fuf;
  266. return(fuf);
  267. }
  268.  
  269. struct iconlist
  270.     {
  271.     char *name;
  272.     int value;
  273.     };
  274.  
  275. static struct iconlist iconsts[] =
  276. {
  277. {"SCREENW", XMAX},
  278. {"SCREENH", YMAX},
  279. {"CHARW", CH_WIDTH},
  280. {"CHARH", CH_HEIGHT},
  281. {"COLORS", COLORS},
  282. };
  283.  
  284.  
  285. init_constants()
  286. {
  287. int i;
  288. char *name;
  289. Symbol *ns;
  290.  
  291. for (i=0; i<Array_els(iconsts); i++)
  292.     {
  293.     name = iconsts[i].name;
  294.     upper_case(name);
  295.     if ((ns = new_symbol(name, CONSTANT, GLOBAL, rframe)) == NULL)
  296.         return(0);
  297.     ns->symval.i = iconsts[i].value;
  298.     }
  299. return(1);
  300. }
  301.  
  302.  
  303. struct kwlist
  304.     {
  305.     char *name;
  306.     int token;
  307.     };
  308.  
  309. struct kwlist kwds[] = 
  310. {
  311. {"NULL", TOK_NULL,},
  312. {"Constant", TOK_CONSTANT,},
  313. {"Cread", TOK_CREAD,},
  314. {"Cwrite", TOK_CWRITE,},
  315. {"not", TOK_LNOT,},
  316. {"and", TOK_LAND,},
  317. {"or", TOK_LOR,},
  318. {"closestt", TOK_CLOSESTT,},
  319. {"Spawn", TOK_SPAWN,},
  320. {"Kill", TOK_KILL,},
  321. {"CID", TOK_CID,},
  322. {"CAGE", TOK_CAGE,},
  323. {"CNEW", TOK_CNEW,},
  324. {"CNAME", TOK_CNAME,},
  325. {"CX", TOK_CX,},
  326. {"CY", TOK_CY,},
  327. {"CDX", TOK_CDX,},
  328. {"CDY", TOK_CDY,},
  329. {"Evolve", TOK_EVOLVE,},
  330. {"else", TOK_ELSE,},
  331. {"function", TOK_FUNCTION,},
  332. {"creature", TOK_CREATURE,},
  333. {"step", TOK_STEP,},
  334. {"goto", TOK_GOTO,},
  335. {"return", TOK_RETURN,},
  336. {"to", TOK_TO,},
  337. {"for", TOK_FOR,},
  338. {"while", TOK_WHILE,},
  339. {"loop", TOK_LOOP,},
  340. {"break", TOK_BREAK,},
  341. {"string", TOK_STRING,},
  342. {"int", TOK_INT,},
  343. {"if", TOK_IF,},
  344. };
  345.  
  346.  
  347. add_keyword(name, tok_type)
  348. char *name;
  349. int tok_type;
  350. {
  351. Symbol *ns;
  352.  
  353. upper_case(name);
  354. if ((ns = new_symbol(name, BAD, 0, rframe)) == NULL)
  355.     return(0);
  356. ns->tok_type = tok_type;
  357. return(1);
  358. }
  359.  
  360.  
  361. init_keywords()
  362. {
  363. int i;
  364.  
  365. for (i=0; i<Array_els(kwds); i++)
  366.     if (!add_keyword(kwds[i].name, kwds[i].token))
  367.         return(0);
  368. return(1);
  369. }
  370.  
  371. pset_color(p)
  372. union pt_int *p;
  373. {
  374. if (!in_graphics)
  375.     to_graphics();
  376. p -= 4;
  377. set_color(p[0].i, p[1].i, p[2].i, p[3].i);
  378. }
  379.  
  380.  
  381. pcreate_fli(p)
  382. union pt_int *p;
  383. {
  384. if (!in_graphics)
  385.     to_graphics();
  386. return(create_fli(p[-2].p, p[-1].i));
  387. }
  388.  
  389.  
  390. char *
  391. nullstring(p)
  392. union pt_int *p;
  393. {
  394. char *n;
  395.  
  396. n = p[-1].p;
  397. if (n == NULL)
  398.     n = "(NULL)";
  399. return(n);
  400. }
  401.  
  402. ptext(p)
  403. union pt_int *p;
  404. {
  405. printf("%s", nullstring(p));
  406. }
  407.  
  408. pprint(p)
  409. union pt_int *p;
  410. {
  411. printf("%d\n", p[-1].i);
  412. }
  413.  
  414. psprint(p)
  415. union pt_int *p;
  416. {
  417. puts(nullstring(p));
  418. }
  419.  
  420. int grav[2];
  421.  
  422. pgravityx(p)
  423. union pt_int *p;
  424. {
  425. int dxy[2];
  426.  
  427. dxy[0] = p[-3].i;
  428. dxy[1] = p[-2].i;
  429. calc_grav(dxy, grav, p[-1].i);
  430. return(grav[0]);
  431. }
  432.  
  433. pgravityy()
  434. {
  435. return(grav[1]);
  436. }
  437.  
  438.  
  439. init_predefs()
  440. {
  441. struct func_frame *fuf;
  442.  
  443. /* File functions */
  444. if ((fuf = add_predef("fopen", popen, 2)) == NULL)
  445.     return(0);
  446. fuf->ptypes[0] = STRING;
  447. fuf->ptypes[1] = STRING;
  448. if (!add_predef("fclose", pclose, 1))
  449.     return(0);
  450. if (!add_predef("GetChar", pgetchar, 1))
  451.     return(0);
  452. if ((fuf = add_predef("GetWord", pgetword, 1)) == NULL)
  453.     return(0);
  454. fuf->ret_type = STRING;
  455. if ((fuf = add_predef("GetLine", pgetline, 1)) == NULL)
  456.     return(0);
  457. fuf->ret_type = STRING;
  458. if (!add_predef("PutChar", pputchar, 2))
  459.     return(0);
  460. if ((fuf = add_predef("PutLine", pputline, 2)) == NULL)
  461.     return(0);
  462. fuf->ptypes[1] = STRING;
  463. if ((fuf = add_predef("PutString", pputs, 2)) == NULL)
  464.     return(0);
  465. fuf->ptypes[1] = STRING;
  466.  
  467. /* Fli functions */
  468. if ((fuf = add_predef("CreateFli", pcreate_fli, 2)) == NULL)
  469.     return(0);
  470. fuf->ptypes[0] = STRING;
  471. if (!add_predef("FliNext", save_next_fli, 0))
  472.     return(0);
  473. if (!add_predef("EndFli", end_fli, 0))
  474.     return(0);
  475. /* pic functions */
  476. if (!add_predef("Pscreen", pscreen, 0))
  477.     return(0);
  478. if (!add_predef("AllocScreen", palloc_screen, 0))
  479.     return(0);
  480. if (!add_predef("UseScreen", puse_screen, 1))
  481.     return(0);
  482. if (!add_predef("FreeScreen", pfree_screen, 1))
  483.     return(0);
  484. if (!add_predef("CopyScreen", pcopy_screen, 2))
  485.     return(0);
  486. if (!add_predef("Blit", pblit, 8))
  487.     return(0);
  488. if (!add_predef("TBlit", ptblit, 8))
  489.     return(0);
  490. if ((fuf = add_predef("LoadPic", pload_pic, 1)) == NULL)
  491.     return(0);
  492. fuf->ptypes[0] = STRING;
  493. if ((fuf = add_predef("SavePic", psave_pic, 1)) == NULL)
  494.     return(0);
  495. fuf->ptypes[0] = STRING;
  496.  
  497. /* Creature finding functions */
  498. if (!add_predef("ClosestCreature", closest_creature, 3))
  499.     return(0);
  500. if ((fuf = add_predef("ClosestType", closest_type, 3)) == NULL)
  501.     return(0);
  502. fuf->ptypes[0] = STRING;
  503. if ((fuf = add_predef("NamedCreature", named_creature, 1)) == NULL)
  504.     return(0);
  505. fuf->ptypes[0] = STRING;
  506. if (!add_predef("ExistsCreature", exists_creature, 1))
  507.     return(0);
  508. /* Creature information function */
  509. if (!add_predef("CreatureX", creature_x, 1))
  510.     return(0);
  511. if (!add_predef("CreatureY", creature_y, 1))
  512.     return(0);
  513. if (!add_predef("CreatureAge", creature_age, 1))
  514.     return(0);
  515. if (!add_predef("CreatureNewBorn", creature_newborn, 1))
  516.     return(0);
  517. if ((fuf = add_predef("CreatureName", creature_name, 1)) == NULL)
  518.     return(0);
  519. fuf->ret_type = STRING;
  520. if (!add_predef("KillAll", kill_all, 0))
  521.     return(0);
  522.  
  523. /* input functions */
  524. if (!add_predef("UseMouse", use_mouse, 0))
  525.     return(0);
  526. if (!add_predef("UseJoystick", use_joy, 0))
  527.     return(0);
  528. if (!add_predef("Joystick", joystick, 0))
  529.     return(0);
  530. if (!add_predef("Clock", get_clock, 0))
  531.     return(0);
  532. if (!add_predef("InKey", inkey, 0))
  533.     return(0);
  534. if (!add_predef("Keyboard", rawkey, 0))
  535.     return(0);
  536. if (!add_predef("WaitKey", waitkey, 0))
  537.     return(0);
  538. if (!add_predef("MouseX", mouse_x, 0))
  539.     return(0);
  540. if (!add_predef("MouseY", mouse_y, 0))
  541.     return(0);
  542. if (!add_predef("MouseLeft", mouse_left, 0))
  543.     return(0);
  544. if (!add_predef("MouseRight", mouse_right, 0))
  545.     return(0);
  546. /* Math functions */
  547. if (!add_predef("Random", random, 1))
  548.     return(0);
  549. if (!add_predef("GravityX", pgravityx, 3))
  550.     return(0);
  551. if (!add_predef("GravityY", pgravityy, 0))
  552.     return(0);
  553. if (!add_predef("XYangle", parctan, 2))
  554.     return(0);
  555. if (!add_predef("SquareRoot", psquare_root, 1))
  556.     return(0);
  557. if (!add_predef("Distance", pdistance, 4))
  558.     return(0);
  559. if (!add_predef("ArcX", parcx, 2))
  560.     return(0);
  561. if (!add_predef("ArcY", parcy, 2))
  562.     return(0);
  563. /* Graphics functions */
  564. if (!add_predef("ToText", to_text, 0))
  565.     return(0);
  566. if (!add_predef("ToGraphics", to_graphics, 0))
  567.     return(0);
  568. if (!add_predef("GNumber", pgnumber, 5))
  569.     return(0);
  570. if ((fuf = add_predef("Gtext", pgtext, 4)) == NULL)
  571.     return(0);
  572. fuf->ptypes[3] = STRING;
  573. if (!add_predef("PutDot", pputdot, 3))
  574.     return(0);
  575. if (!add_predef("GetDot", pgetdot, 2))
  576.     return(0);
  577. if (!add_predef("Rectangle", rectangle, 5))
  578.     return(0);
  579. if (!add_predef("Disk", pdisk, 4))
  580.     return(0);
  581. if (!add_predef("Circle", pcircle, 4))
  582.     return(0);
  583. if (!add_predef("SetColor", pset_color, 4))
  584.     return(0);
  585. if (!add_predef("Line", pline, 5))
  586.     return(0);
  587. if (!add_predef("ClearScreen", clear_screen, 0))
  588.     return(0);
  589. /* "Turtle" functions */
  590. if (!add_predef("Right", right, 1))
  591.     return(0);
  592. if (!add_predef("Left", left, 1))
  593.     return(0);
  594. if (!add_predef("PenUp", penup, 0))
  595.     return(0);
  596. if (!add_predef("PenDown", pendown, 0))
  597.     return(0);
  598. if (!add_predef("PenColor", pencolor, 1))
  599.     return(0);
  600. if (!add_predef("Forward", forward, 1))
  601.     return(0);
  602. if (!add_predef("Reverse", reverse, 1))
  603.     return(0);
  604. /* Animation function */
  605. if (!add_predef("PreSwap", pre_swap, 0))
  606.     return(0);
  607. if (!add_predef("DeSwap", de_swap, 0))
  608.     return(0);
  609. if (!add_predef("Swap", swap, 0))
  610.     return(0);
  611. if (!add_predef("Vsync", vsync, 0))
  612.     return(0);
  613. if ((fuf = add_predef("Text", ptext, 1)) == NULL)
  614.     return(0);
  615. fuf->ptypes[0] = STRING;
  616. if ((fuf = add_predef("PrintS", psprint, 1)) == NULL)
  617.     return(0);
  618. fuf->ptypes[0] = STRING;
  619. if (!add_predef("Print", pprint, 1))
  620.     return(0);
  621. if ((fuf = add_predef("StrChar", pstrchar, 1)) == NULL)
  622.     return(0);
  623. fuf->ret_type = STRING;
  624. if ((fuf = add_predef("StrNum", pstrnum, 1)) == NULL)
  625.     return(0);
  626. fuf->ret_type = STRING;
  627. if ((fuf = add_predef("itoa", pstrnum, 1)) == NULL)
  628.     return(0);
  629. fuf->ret_type = STRING;
  630. if ((fuf = add_predef("StrLen", pstrlen, 1)) == NULL)
  631.     return(0);
  632. fuf->ptypes[0] = STRING;
  633. if ((fuf = add_predef("CharAt", pcharat, 2)) == NULL)
  634.     return(0);
  635. fuf->ptypes[0] = STRING;
  636. if ((fuf = add_predef("CharTo", pcharto, 3)) == NULL)
  637.     return(0);
  638. fuf->ptypes[0] = STRING;
  639. return(1);
  640. }
  641.